home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / tif2xbm / src / tif2x010.c < prev   
C/C++ Source or Header  |  1993-11-30  |  5KB  |  223 lines

  1. /*************************************************************************
  2.  
  3.             TIFF → XBM コンバータ  TIF2XBM Ver 0.10
  4.  
  5.                                                       Jun. 30, 1993
  6.  
  7.                                      Copyright (c)  すりぃPi  1993
  8.  
  9. **************************************************************************/
  10.  
  11. #include    <stdio.h>
  12. #include    <stdlib.h>
  13. #include    <msdos.cf>                        /* get_ds */
  14. #include    <egb.h>
  15. #include    <mos.h>
  16.  
  17. typedef struct point{
  18.     int x ;
  19.     int y ;
  20. } POINT ;
  21.  
  22. typedef struct rect{
  23.     int x1 ;
  24.     int y1 ;
  25.     int x2 ;
  26.     int y2 ;
  27. } RECT ;
  28.  
  29. void get_block( RECT rect, char *buf ) ;
  30. void put_xbm( int width, int height, char *buf, char *filename ) ;
  31. char bit_reverse( char buf ) ;
  32.  
  33. void GRA_init( void ) ;
  34. void GRA_box_xor( RECT rect ) ;
  35. POINT GRA_mos_left_drop( POINT point ) ;
  36. void GRA_mos_left_up( void ) ;
  37. RECT select( RECT rect ) ;
  38. void swap( int *data1, int *data2 ) ;
  39.  
  40. char gwk[1536] ;
  41. char mwk[4096] ;
  42. char pat_work[258] ;
  43.  
  44. void main( int argc, char *argv[] )
  45. {
  46.     int width ;
  47.     int height ;
  48.     char *filename ;
  49.     char *buf ;
  50.     int bufsize ;
  51.     RECT rect ;
  52.  
  53.     if( argc < 2 )
  54.         exit(1) ;
  55.     filename = argv[1] ;
  56.  
  57.     GRA_init() ;
  58.  
  59.     /* この間に sidework の tiffloader で画像を読み込む(^^)         */
  60.     /* 画像は 16色 にすること。2値画像では何故かうまくいかない?? */
  61.     /* と言ううちに、原因がわかった(^^;)。sidework の 「てふ」 は 2値 */
  62.     /* 画像を読み込む時に、色識別番号 0 で書き込まずに、8 で書き込ん*/
  63.     /* でいるのであった(^^)。くそ~、だいぶ悩んだぞぉ~(^^;)(^^;)。 */
  64.  
  65.     rect = select( rect ) ;
  66.     MOS_end() ;
  67.  
  68.     width = rect.x2 - rect.x1 + 1 ;
  69.     height = rect.y2 - rect.y1 + 1 ;
  70.     bufsize = ( width + 7 )/8 * height ;
  71.     if( (buf = (char *)malloc( bufsize )) == NULL ) exit( 1 ) ;
  72.     get_block( rect, buf ) ;
  73.  
  74.     put_xbm( width, height, buf, filename ) ;
  75.  
  76.     free( buf ) ;
  77. }
  78.  
  79. void get_block( RECT rect, char *buf )
  80. {
  81.     char para[32] ;
  82.  
  83.     DWORD( para +  0 ) = (unsigned int)buf ;    
  84.     WORD ( para +  4 ) = getds() ;
  85.     WORD ( para +  6 ) = rect.x1 ;
  86.     WORD ( para +  8 ) = rect.y1 ;
  87.     WORD ( para + 10 ) = rect.x2 ;
  88.     WORD ( para + 12 ) = rect.y2 ;
  89.     WORD ( para + 14 ) = 2 ;
  90.     DWORD( para + 16 ) = 0 ;
  91.     DWORD( para + 20 ) = 8 ;
  92.  
  93.     EGB_getBlockColor( gwk, para ) ;
  94. }
  95.  
  96. void put_xbm( int width, int height, char *buf, char *filename )
  97. {
  98.     int i ;
  99.     int bufsize ;
  100.  
  101.     bufsize = ( width + 7 )/8 * height ;
  102.  
  103.     printf( "#define %s_width  %d\n", filename, width ) ;
  104.     printf( "#define %s_height %d\n\n", filename, height ) ;
  105.     printf( "static char %s_bits[] = {\n", filename ) ;
  106.  
  107.     printf( "   0x%02x", (int)bit_reverse( *buf++ ) ) ;
  108.     for( i = 2; i <= bufsize; i++ ){
  109.         if( (i % 12) == 1 )
  110.             printf( ",\n   0x%02x", (int)bit_reverse( *buf++ ) ) ;
  111.         else
  112.             printf( ", 0x%02x", (int)bit_reverse( *buf++ ) ) ;
  113.     }
  114.     printf( "\n}\n" ) ;
  115. }
  116.  
  117. char bit_reverse( char buf )
  118. {
  119.     int i ;
  120.     char bit = 0 ;
  121.  
  122.     for( i = 1; ; i++ ){
  123.         bit = ( buf & 0x01 ) | bit ;
  124.         if( i == 8 ) break ;
  125.         buf >>= 1 ;
  126.         bit <<= 1 ;
  127.     }
  128.     return bit ;
  129. }
  130.  
  131. void GRA_init( void )
  132. {
  133.     EGB_init( gwk, 1536 ) ;
  134.     EGB_resolution( gwk, 0, 3 ) ;
  135.     EGB_displayPage( gwk, 0, 1 ) ;
  136.     EGB_writePage( gwk, 0 ) ;
  137.     EGB_color( gwk, 0, 0x00 ) ;
  138.     EGB_color( gwk, 1, 0x0F ) ;
  139.     EGB_clearScreen( gwk ) ;
  140.  
  141.     MOS_start( mwk, 4096 ) ;
  142.     MOS_typeRom( 81, 1, 1, pat_work ) ;
  143.     MOS_horizon( 0, 639 ) ;
  144.     MOS_vertical( 0, 479 ) ;
  145.     MOS_disp( 1 ) ;
  146. }
  147.  
  148. POINT GRA_mos_left_drop( POINT point )
  149. {
  150.     int button ;
  151.  
  152.     do{
  153.         MOS_rdpos( &button, &point.x, &point.y ) ;
  154.     } while( (button & 0x01) == 0 ) ;
  155.  
  156.     return point ;
  157. }
  158.  
  159. void GRA_mos_left_up( void )
  160. {
  161.     int button ;
  162.     POINT point ;
  163.  
  164.     do{
  165.         MOS_rdpos( &button, &point.x, &point.y ) ;
  166.     } while( (button & 0x01) != 0 ) ;
  167. }
  168.  
  169. RECT select( RECT rect )
  170. {
  171.     POINT point ;
  172.     int button ;
  173.  
  174.     for( ; ; ){
  175.         point = GRA_mos_left_drop( point ) ;
  176.         MOS_disp( 0 ) ;
  177.         GRA_mos_left_up() ;
  178.         rect.x1 = rect.x2 = point.x ;
  179.         rect.y1 = rect.y2 = point.y ;
  180.  
  181.         GRA_box_xor( rect ) ;
  182.         do{
  183.             MOS_rdpos( &button, &point.x, &point.y ) ;
  184.             if ( (rect.x2 - point.x) != 0 || (rect.y2 - point.y) != 0 ){
  185.                 GRA_box_xor( rect ) ;
  186.                 rect.x2 = point.x ;
  187.                 rect.y2 = point.y ;
  188.                 GRA_box_xor( rect ) ;
  189.             }
  190.         } while( (button & 0x03) == 0 ) ;
  191.         GRA_box_xor( rect ) ;
  192.         MOS_disp( 1 ) ;
  193.         if( (button & 0x01) != 0 ) break ;
  194.     }
  195.     if( rect.x1 > rect.x2 ) swap( &rect.x1, &rect.x2 ) ;
  196.     if( rect.y1 > rect.y2 ) swap( &rect.y1, &rect.y2 ) ;
  197.     return rect ;
  198. }
  199.  
  200. void GRA_box_xor( RECT rect )
  201. {
  202.     char para[10] ;
  203.  
  204.     EGB_writeMode( gwk, 4 ) ;
  205.     EGB_color( gwk, 0, 0x0F ) ;
  206.  
  207.     WORD(para + 0) = rect.x1 ;
  208.     WORD(para + 2) = rect.y1 ;
  209.     WORD(para + 4) = rect.x2 ;
  210.     WORD(para + 6) = rect.y2 ;
  211.  
  212.     EGB_rectangle( gwk, para ) ;
  213. }
  214.  
  215. void swap( int *data1, int *data2 )
  216. {
  217.     int tmp ;
  218.  
  219.     tmp = *data1 ;
  220.     *data1 = *data2 ;
  221.     *data2 = tmp ;
  222. }
  223.